package com.tx.review.thread_.state;

import java.util.concurrent.TimeUnit;

/**
 * wait和notify测试
 *
 * @author ：tx
 * @version:
 */
public class WaitDemo {
    private static Object obj = new Object();

    /**
     * 1、wait会释放锁，也会释放cpu资源。因为现在ABC三个线程用的是同一把锁，如果是正常情况，那么是进不了方法的，但现在是可以进来，说明释放了锁
     * 2、wait和notify要在同步块中。不然会抛出异常IllegalMonitorStateException。这是因为wait会释放锁，如果没有锁，就会报异常
     * 3、当线程调用wait之后会被加入到等待队列中，需要被唤醒
    */
    public static void main(String[] args) {
        MyRunnable myRunnable = new WaitDemo.MyRunnable();
        new Thread(myRunnable,"A").start();
        new Thread(myRunnable,"B").start();
        new Thread(myRunnable,"C").start();

        try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }

        //唤醒
        synchronized (obj){
            System.out.println("唤醒线程");
            //唤醒等待队列中所有的线程
//            obj.notifyAll();
            //在等待队列中随意唤醒一个线程
            obj.notify();
        }

    }


    static class MyRunnable implements Runnable{

        @Override
        public void run() {
            try {
                synchronized (obj){
                    System.out.println(Thread.currentThread().getName() +"-->wait");
                    obj.wait(); //使当前线程进入等待队列（Object.wait队列中），并释放锁
                    System.out.println(Thread.currentThread().getName() + "-->被唤醒了");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}



